[기초] CLASS

Java의 클래스 정의, this 키워드, static, 싱글톤(singleton) 패턴을 예제로 정리한 기초 노트다. 핵심은 this가 현재 인스턴스 자신을 가리키는 반면 static은 모든 인스턴스가 공유하는 클래스 변수/함수라는 차이이며, 이 static 성질을 이용해 생성자를 private으로 막고 getInstance()로만 인스턴스를 내주는 것이 싱글톤 패턴의 핵심이다.

실행 환경

클래스, 생성자, static 등 특정 JDK 버전에 종속되지 않는 Java 기본 문법만 사용되어 별도 버전 명시가 필요하지 않다. 표준 JDK 컴파일 환경이면 재현 가능하다.

📌 개념

class 생성

public class 클래스명{
     멤버 변수1
     멤버 변수2
}
 
// 생성자
public 클래스명(){} // 기본 생성자
public 클래스명(매개변수1, 매개변수2){
     this.멤버변수1 = 매개변수1;
     클래스명.멤버변수2 = 매개변수2;
} // this 와 클래스명은 동일
 
// 멤버함수
public 반환형 함수명(매개변수){
     함수 본체;
}
  • 매개변수: 임의의 변수뿐 아니라 클래스 및 클래스 멤버변수도 가능
  • 생성자를 따로 지정할 경우 기본 생성자는 생성되지 않음
  • this는 해당 인스턴스를 뜻함
  • 인스턴스: 클래스를 이용하여 만든 객체

class 이용

  • 클래스명 인스턴스명 = new 클래스명();
  • 생성자에 매개변수가 있는 경우: 클래스명 인스턴스명 = new 클래스명(매개변수);

this

  • this : 현재 자기 자신 인스턴스를 뜻함 (가리키는 주소를 가지고 있음)
  • 생성자에서 다른 생성자를 부를 때 this 사용
class Person(){
     String name;
     int age;
 
     public Person(){
          this("이름 없음", 1);
     }
     public Person(String name, int age){
          this.name = name;
          this.age = age;
     }
 
     Person p1 = new Person();
     System.out.println(p1);
     // 이름없음 , 1  출력

매개변수에 다른 클래스 삽입 가능

public class Bus{
     int busNum;
     int money;
 
     public Bus(int busNum){
          this.busNum = busNum;
     }
     public void take(int money){
          this.money += money;
     // bus money
     }
public class Student{
     String name;
     int money;
     public Student(String name, int money){
          this.name = name;
          this.money = money;
     }
 
     public void takeBus(Bus bus){
          bus.take(1000);
          money -= 1000;
     // Student money
     }

static

  • 모든 인스턴스가 공유하는 변수 (클래스 변수라고도 불림)
  • 사용 방법: static 자료형 변수이름
  • 주의) static을 이용한 함수 내에 멤버변수가 있으면 안 됨
// 인스턴스가 생성되지 않아도 사용할 수 있는 static이므로, static 함수 내에 멤버변수를 사용할 수 없다.
public static int take(){
     studentName = "홍길동"; // 멤버변수 사용불가
     int i; // 지역변수는 사용가능
     return static변수;
}
변수 종류선언 위치특징
멤버 변수클래스 멤버 변수로 선언인스턴스를 만들 때 생성
static 변수클래스 내부 선언멤버변수보다 먼저 생성됨 (인스턴스 생성 전에 존재)
지역변수함수 내부 선언함수 내부에서 사용 가능

static 응용 (singleton)

  • 여러 종류의 인스턴스 생성 방지
public class Company{
     private static Company instance = new Company();
     // 인스턴스를 private하게 만들어 main에서 생성 못하게 함. (static은 공유)
     private Company(){}
     // 클래스 내부에서 인스턴스를 생성해야 함
     public static Company getInstance(){
          if(instance == null)
               instance = new Company();
          return instance;
     // 인스턴스 생성된 것을 반환해줌
     }
}
  • Company c1 = Company.getInstance(); : Company의 c1 변수에 클래스 내부에서 만들어진 인스턴스를 삽입
  • Company c2 = Company.getInstance(); : c1과 동일한 주소값을 가짐 (이름은 달라도 내부는 동일한 instance)
  • singleton : 한 개의 인스턴스를 이용 (공유되는 인스턴스)